//
//  HLNetWorking.h
//  AFNetworkingDemo
//
//  Created by 胡林虎 on 16/5/14.
//  Copyright © 2016年 胡林虎. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>


typedef NS_ENUM(NSUInteger, WNRequestDataPolicy){
    WNReturnCacheDataThenLoad = 0,///< 有缓存就先返回缓存，同步请求数据
    WNReloadNetDataDontSaveCache, ///< 直接请求网络，同时不存储缓存
};

typedef NS_ENUM(NSInteger,kHttpMethod) {
    HttpMethod_GET,     ///<  数据请求类型 --- GET
    HttpMethod_POST     ///<  数据请求类型 --- POST
};

typedef void(^ResponseSuccess)(id responseObject);
typedef void(^Responsefailed)(NSError *error);

/*!
 *
 *  上传进度
 *
 *  @param bytesWritten              已上传的大小
 *  @param totalBytesWritten         总上传大小
 */
typedef void (^kUploadProgress)(int64_t bytesWritten,
                                int64_t totalBytesWritten);
/*!
 *  下载进度
 *
 *  @param bytesRead                 已下载的大小
 *  @param totalBytesRead            文件总大小
 *  @param totalBytesExpectedToRead 还有多少需要下载
 */
typedef void (^kDownloadProgress)(int64_t bytesRead,
                                  int64_t totalBytesRead);

@interface HLNetWorking : NSObject

/**
 *	获取缓存总大小/bytes
 *
 *	@return 缓存大小
 */
+ (unsigned long long)totalCacheSize;
/**
 *
 *	清除缓存
 */
+ (void)clearCaches;
/**
 *
 *	取消所有请求
 */
+ (void)cancelAllRequest;
/**
 *
 *	取消某个请求。如果是要取消某个请求，最好是引用接口所返回来的HYBURLSessionTask对象，
 *  然后调用对象的cancel方法。如果不想引用对象，这里额外提供了一种方法来实现取消某个请求
 *
 *	@param url				URL，可以是绝对URL，
 */
+ (void)cancelRequestWithURL:(NSString *)url;

/**
 *  https 请求时间 默认 10.0s
 *
 *  @param timeoutInterval 请求时间设置
 */
+(void)requestTimeoutInterval:(NSInteger)timeoutInterval;

/**
 *
 *  配置公共的请求头，只调用一次即可，通常放在应用启动的时候配置就可以了
 *
 *  @param httpHeaders 只需要将与服务器商定的固定参数设置即可
 */
+ (void)configCommonHttpHeaders:(NSDictionary *)httpHeaders;

/**
 *  https 证书验证
 *
 *  @param isAllow     https是否允许无效证书
 *  @param isValidates https是否验证域名
 */
+(void)httpsRequestAllowInvalidCertificates:(BOOL)isAllow ValidatesDomainName:(BOOL)isValidates;


/**
 *  网络请求 -- 无缓存
 *
 *  @param urlString      请求的url
 *  @param parameters     请求参数
 *  @param isrequireToken 是否需要token
 *  @param httpMethod     请求类型
 *  @param progress       进度指示
 *  @param successBlock   成功回调
 *  @param errorBlock     失败回调
 *
 *  @return
 */

+ (NSURLSessionTask *)requestWithURLFromRequestUrl:(NSString *)urlString
                                            parameters:(NSDictionary *)parameters
                                      requireToken:(BOOL)isrequireToken
                                        httpMethod:(kHttpMethod)httpMethod
                                          progress:(kDownloadProgress)progress
                                    requestSuccess:(ResponseSuccess)successBlock
                                     requestFailed:(Responsefailed)errorBlock;




/**
 *  网络请求  -- 同时缓存
 *
 *  @param urlString      请求的url
 *  @param parameters     请求参数
 *  @param isrequireToken 是否需要token
 *  @param httpMethod     请求类型
 *  @param dataPolicy     请求数据策略
 *  @param successBlock   成功回调
 *  @param errorBlock     失败回调
 *
 *  @return
 */
+ (NSURLSessionTask *)requestWithURLFromRequestUrl:(NSString *)urlString
                                        parameters:(NSDictionary *)parameters
                                      requireToken:(BOOL)isrequireToken
                                        httpMethod:(kHttpMethod)httpMethod
                                          progress:(kDownloadProgress)progress
                                        dataPolicy:(WNRequestDataPolicy)dataPolicy
                                    requestSuccess:(ResponseSuccess)successBlock
                                     requestFailed:(Responsefailed)errorBlock;


/**
 *   上传文件 -- 单文件
 *
 *  @param urlString      请求的urlString
 *  @param uploadfile     上传的文件 NSdata,NSString路径
 *  @param filename       上传文件的名称
 *  @param name           跟后台协商的name
 *  @param mimeType       上传的类型
 *  @param parameters     参数
 *  @param isrequireToken token
 *  @param progress       上传的进度
 *  @param successBlock   成功回调
 *  @param errorBlock     失败回调
 *
 *  @return  上传的task
 */

//+ (NSURLSessionTask *)uploadFileWithURL:(NSString *)urlString
//                            uploadfile:(id)uploadfile
//                              filename:(NSString *)filename
//                                  name:(NSString *)name
//                              mimeType:(NSString *)mimeType
//                            parameters:(NSDictionary *)parameters
//                          requireToken:(BOOL)isrequireToken
//                              progress:(kUploadProgress)progress
//                               success:(ResponseSuccess)successBlock
//                                  fail:(Responsefailed)errorBlock;



/**
 *  上传文件  -- 数组形式
 *
 *  @param urlString       上传请求的UrlString
 *  @param uploadfileArray 上传的数据 里面存放 path NSData
 *  @param filenameArray   上传文件的名字必须一一对应
 *  @param name            跟后台协商的文件名字
 *  @param mimeType        上传的文件类型
 *  @param parameters      上传的请求参数
 *  @param isrequireToken  是否需要token
 *  @param progress        上传的进度
 *  @param successBlock    成功回调
 *  @param errorBlock      失败回调
 *
 *  @return 上传的task
 */

+ (NSURLSessionTask *)uploadFileWithURL:(NSString *)urlString
                          uploadfileArray:(NSArray *)uploadfileArray
                            filenameArray:(NSArray *)filenameArray
                                     name:(NSString *)name
                                 mimeType:(NSString *)mimeType
                               parameters:(NSDictionary *)parameters
                             requireToken:(BOOL)isrequireToken
                                 progress:(kUploadProgress)progress
                                  success:(ResponseSuccess)successBlock
                                     fail:(Responsefailed)errorBlock;


/**
 *  下载文件 -- 文件下载
 *
 *  @param urlString        下载请求的urlString
 *  @param downloadfilePath 下载到存储路径
 *  @param progressBlock    下载进度
 *  @param successBlock     成功回调
 *  @param errorBlock       失败回调
 *
 *  @return 下载的task
 */

+ (NSURLSessionDownloadTask *)downloadWithUrl:(NSString *)urlString
                                 downloadfile:(NSString *)downloadfilePath
                                     progress:(kDownloadProgress)progressBlock
                                      success:(ResponseSuccess)successBlock
                                         fail:(Responsefailed)errorBlock;




@end
